-- @Author: baidwwy
-- @Date:   2018-08-11 11:38:56
-- @Last Modified by:   baidwwy
-- @Last Modified time: 2018-09-06 01:38:24

local mp = require("MessagePack")
local ffi = require("ffi")
local _flag = 14138 --包头识别
local _maxbuf = 10240
ffi.cdef[[
    typedef struct
    {
        uint32_t flag;
        uint32_t len;
    }ggehead;
]]

local ggebuf = class()
function ggebuf:初始化(len)
    self.buflen    = len or _maxbuf --缓存大小
    self.bodylen   = self.buflen - 8--包体长度
    self.data      = ffi.new('uint8_t[?]',self.buflen)
    self.head      = ffi.cast('ggehead*',self.data)
    self.head.flag = _flag
end
function ggebuf:添加数据( ... )
    local data = mp.pack{...}
    local len = #data
    assert(#data<self.bodylen, '数据过长.')
    ffi.copy(self.data+8,data,len)
    self.head.len = 8+len
    return self:取指针(),self:取长度()
end
--=========================解包========================================
function ggebuf:取头长()--0包头，1序号，2长度
    return 8
end
function ggebuf:校验头(info)--成功返回包体长度
    if self.head.flag == _flag and self.head.len >0 and self.head.len <=self.bodylen then
        return self.head.len-8
    end
    return 0
end
function ggebuf:取数据(info)
    local data = ffi.string(self.data,info.len)
    local t = mp.unpack(data)
    if type(t) == 'table' then
        return t,1,table.maxn(t)
    end
    return {}
end
function ggebuf:取指针()
    return tonumber(ffi.cast("intptr_t",self.data))--指针
end
function ggebuf:取长度()
    return self.head.len
end
return ggebuf